package com.D5Power.Editor
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	
	import org.aswing.JPanel;
	import org.aswing.LayoutManager;
	import org.aswing.border.TitledBorder;
	
	public class SmallMap extends JPanel
	{
		/**
		 * 显示小地图用的位图
		 */ 
		private var _bitmap:Bitmap;
		/**
		 * 小地图的位图数据
		 */ 
		private var _bitmapdata:BitmapData;
		
		

		/**
		 * 间距
		 */ 
		private var _padding:uint = 5;
		
		/**
		 * 关联大地图显示器
		 */ 
		private var _mapShower:MapShower;
		
		/**
		 * 当前显示区域标识框
		 */ 
		private var _nowDisplayArea:Sprite;
		
		/**
		 * 状态，标识框是否正在拖拽
		 */ 
		private var _isDrag:Boolean=false;
		
		/**
		 * 根据游戏引擎的渲染比例，计算出的符合小地图尺寸比例的最大宽度
		 */ 
		protected var _maxX:uint;
		/**
		 * 根据游戏引擎的渲染比例，计算出的符合小地图尺寸比例的最大高度
		 */ 
		protected var _maxY:uint;
		
		protected var _root:MapEditor;
		
		public function SmallMap(root:MapEditor,layout:LayoutManager=null)
		{
			super(layout);
			_root = root;
			addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
			addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
			addEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
			addEventListener(MouseEvent.MOUSE_MOVE,updateCenter);

			
			
			setPreferredHeight(D5Power.SMALLMAPSIZE+_padding);
			setBorder(new TitledBorder(null,'小地图',TitledBorder.TOP,TitledBorder.LEFT,2));
		}
		
		/**
		 * 加载缩略图
		 */ 
		public function loadSmallMap():void
		{
			if(_bitmapdata!=null)
			{
				_bitmapdata.dispose();
				_bitmapdata = null;
			}
			
			_maxX = D5Power.SMALLMAPSIZE-_padding*2;
			_maxY = _maxX/Global.MAPSIZE.x*Global.MAPSIZE.y;
			_bitmapdata = new BitmapData(_maxX,_maxY,false,0);

			if(_bitmap==null)
			{
				_bitmap = new Bitmap(_bitmapdata);
				_bitmap.x = _padding;
				addChild(_bitmap);
			}else{
				_bitmap.bitmapData = _bitmapdata;
			}
			
			_bitmap.y = 10+int((D5Power.SMALLMAPSIZE-_bitmapdata.height)/2);
			
			var areaw:uint = Math.floor(Global.W/Global.MAPSIZE.x*_maxX);
			var areah:uint = Math.floor(Global.H/Global.MAPSIZE.y*_maxY);
			
			if(_nowDisplayArea==null)
			{
				_nowDisplayArea = new Sprite();
				addChild(_nowDisplayArea);
			}
			_nowDisplayArea.graphics.clear();
			_nowDisplayArea.graphics.lineStyle(1,0xFFFFFF);
			_nowDisplayArea.graphics.lineTo(areaw,0);
			_nowDisplayArea.graphics.lineTo(areaw,areah);
			_nowDisplayArea.graphics.lineTo(0,areah);
			_nowDisplayArea.graphics.lineTo(0,0);

			updateDisplayArea();
			
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplate);
			loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onIO);
			loader.load(new URLRequest('asset/tiles/'+_mapShower.scene.Map.mapid+'/s.jpg'));
			
			
		}
		
		/**
		 * 缩略图加载完成
		 */ 
		private function onComplate(e:Event):void
		{
			var loader:Loader = (e.target as LoaderInfo).loader;
			
			_bitmapdata.fillRect(_bitmapdata.rect,0);
			_bitmapdata.draw(loader.content,new Matrix(_bitmapdata.width/loader.content.width,0,0,_bitmapdata.height/loader.content.height));
			loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onComplate);
			loader.unload();
			loader=null;
		}
		
		private function onIO(e:Event):void{}
		
		/**
		 * 鼠标按下
		 * 只有鼠标的坐标在表示框的范围内才会触发拖拽事件
		 */ 
		private function onMouseDown(e:MouseEvent):void
		{
			if(e.localX>_nowDisplayArea.x && e.localX<_nowDisplayArea.x+_nowDisplayArea.width && e.localY>_nowDisplayArea.y && e.localY<_nowDisplayArea.y+_nowDisplayArea.height)
			{
				_nowDisplayArea.startDrag(false,new Rectangle(_padding,_padding,_maxX-_nowDisplayArea.width,_maxY-_nowDisplayArea.height));
				_isDrag=true;
			}
		}
		
		private function onMouseOut(e:MouseEvent):void
		{
			_isDrag=false;
			if(_nowDisplayArea==null) return;
			_nowDisplayArea.stopDrag();
		}
		
		/**
		 * 鼠标弹起
		 */ 
		private function onMouseUp(e:MouseEvent):void
		{
			if(!_isDrag) return;
			_nowDisplayArea.stopDrag();
			updateCenter(e);
			_isDrag=false;
		}
		
		/**
		 * 更新视口区域
		 */ 
		private function updateCenter(e:MouseEvent):void
		{
			if(e.type==MouseEvent.MOUSE_MOVE && !_isDrag) return;
			var localX:int = e.localX-_bitmap.x;
			var localY:int = e.localY-_bitmap.y;
			
			// 计算在大地图上的坐标
			var trueX:int = Math.floor(localX/_maxX*Global.MAPSIZE.x);
			var trueY:int = Math.floor(localY/_maxY*Global.MAPSIZE.y);
			
			_mapShower.scene.Map.Center = new Point(trueX,trueY);
			updateDisplayArea(localX,localY);
			e.updateAfterEvent();
		}

		
		/**
		 * 更新视口标识框坐标
		 * @param	_x	标识框的中心点在场景上的坐标，一般为鼠标事件的localX
		 * @param	_y	标识框的中心点在场景上的坐标
		 */ 
		private function updateDisplayArea(_x:int=0,_y:int=0):void
		{
			_x = _x -_nowDisplayArea.width/2;
			_y = _y - _nowDisplayArea.height/2;
				
			_x = Math.max(_bitmap.x,_x);
			_x = Math.min(_bitmap.x+_maxX-_nowDisplayArea.width,_x);
			
			_y = Math.max(_bitmap.y,_y);
			_y = Math.min(_bitmap.y+_maxY-_nowDisplayArea.height,_y);

			_nowDisplayArea.x = _x;
			_nowDisplayArea.y = _y;
		}
		/**
		 * 修改小地图
		 */ 
		public function get data():BitmapData
		{
			return _bitmapdata;	
		}
		/**
		 * 关联大地图显示器
		 */ 
		public function set mapShower(s:MapShower):void
		{
			_mapShower=s;
			s.smallMap=this;
			//loadSmallMap();
		}
		/**
		 * 小地图的宽度
		 */ 
		public function get mapsize():int
		{
			return _maxX;
		}
		
		/**
		 * 
		 */ 
		public function clear():void
		{
			removeEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
			removeEventListener(MouseEvent.MOUSE_UP,onMouseUp);
			removeEventListener(MouseEvent.MOUSE_OUT,onMouseOut);
			removeEventListener(MouseEvent.MOUSE_MOVE,updateCenter);
			
			_bitmapdata.dispose();
			_bitmapdata = null;
			
			_mapShower = null;
			
			_nowDisplayArea.graphics.clear();
			_nowDisplayArea=null;
		}
	}
}